package com.woniu.service.impl;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.woniu.entity.dto.TrainerSearchDTO;
import com.woniu.entity.PageResult;
import com.woniu.pojo.Trainer;
import com.woniu.mapper.TrainerMapper;
import com.woniu.entity.vo.TrainerListVO;
import com.woniu.service.ITrainerService;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class TrainerServiceImpl extends ServiceImpl<TrainerMapper, Trainer> implements ITrainerService {

    @Autowired
    private RedisTemplate redisTemplate;

    @Resource
    private TrainerMapper trainerMapper;

    @Override
    public PageResult<TrainerListVO> listSearch(TrainerSearchDTO trainerSearchDTO) {
        // 一种是基于mybatisPlus的wrapper来实现,但是该种方式查询出来的结果集只能是Trainer对象，不符合要求，我们需要查询出来的是TrainerListVO
        // 一种是基于mybatis的写法，就是写传统的SQL语句，此处我们需要查询一个业务实体VO，故采用该种方式
        // 1. 构建分页对象
        Page<TrainerListVO> page = new Page<>(trainerSearchDTO.getCurrentPage(), trainerSearchDTO.getPageSize());
        // 2. 执行查询（需要分页查询的时候，第一个位置的参数必须传入page对象，只要第一个位置是page对象，就可以自动分页）
        page = trainerMapper.listSearch(page, trainerSearchDTO);
        // 3. 构建返回对象
        PageResult<TrainerListVO> pageResult = new PageResult<>();
        pageResult.setTotal(page.getTotal());
        pageResult.setData(page.getRecords());
        // 4. 返回数据
        return pageResult;
    }

    @Cacheable(value = "trainer:listAll")
    @Override
    public List<Trainer> listAll() {
        // 1. 从redis中数据，如果redis中存在数据，直接返回就可以，不需要查询数据库
        List trainerList = redisTemplate.opsForList().range("trainerList", 0, -1);
        if(trainerList != null && trainerList.size() > 0){
            return trainerList;
        }
        // 2. 如果redis中没有数据，查询数据
        List<Trainer> trainerList1 = trainerMapper.listAll();
        // 3. 将数据库中的查询出来的数据存储到redis中
        redisTemplate.opsForList().leftPush("trainerList", trainerList1);
        // 4. 再返回数据
        return trainerMapper.listAll();
    }

    @Override
    public List<Trainer> listTrainerName() {
        return trainerMapper.listTrainerName();
    }
}